home *** CD-ROM | disk | FTP | other *** search
/ Computer Shopper 242 / Issue 242 - April 2008 - DPCS0408DVD.ISO / Software Money Savers / VirtualDub / Source / VirtualDub-1.7.7-src.7z / src / h / vd2 / system / vectors_int.h < prev    next >
Encoding:
C/C++ Source or Header  |  2007-01-07  |  6.9 KB  |  184 lines

  1. class vdint2 {
  2. public:
  3.     typedef vdint2 self_type;
  4.     typedef int value_type;
  5.  
  6.     void set(int x2, int y2) { x=x2; y=y2; }
  7.  
  8.     int&        operator[](int k)                    { return v[k]; }
  9.     const int&    operator[](int k) const                { return v[k]; }
  10.  
  11.     int            lensq() const                        { return x*x + y*y; }
  12.     int            len() const                            { return (int)sqrtf((float)(x*x + y*y)); }
  13.     self_type    normalized() const                    { return *this / len(); }
  14.  
  15.     self_type    operator-() const                    { const self_type a = {-x, -y}; return a; }
  16.  
  17.     self_type    operator+(const self_type& r) const    { const self_type a = {x+r.x, y+r.y}; return a; }
  18.     self_type    operator-(const self_type& r) const    { const self_type a = {x-r.x, y-r.y}; return a; }
  19.  
  20.     self_type&    operator+=(const self_type& r)        { x+=r.x; y+=r.y; return *this; }
  21.     self_type&    operator-=(const self_type& r)        { x-=r.x; y-=r.y; return *this; }
  22.  
  23.     self_type    operator*(const int s) const        { const self_type a = {x*s, x*s}; return a; }
  24.     self_type&    operator*=(const int s)                { x*=s; y*=s; return *this; }
  25.  
  26.     self_type    operator/(const int s) const        { const self_type a = {x/s, y/s}; return a; }
  27.     self_type&    operator/=(const int s)                { x/=s; y/=s; return *this; }
  28.  
  29.     self_type    operator*(const self_type& r) const        { self_type a = {x*r.x, y*r.y}; return a; }
  30.     self_type&    operator*=(const self_type& r)            { x*=r.x; y*=r.y; return *this; }
  31.  
  32.     self_type    operator/(const self_type& r) const        { self_type a = {x/r.x, y/r.y}; return a; }
  33.     self_type&    operator/=(const self_type& r)            { x/=r.x; y/=r.y; return *this; }
  34.  
  35.     union {
  36.         struct {
  37.             int x;
  38.             int y;
  39.         };
  40.         int v[2];
  41.     };
  42. };
  43.  
  44. VDFORCEINLINE vdint2 operator*(const int s, const vdint2& v) { return v*s; }
  45.  
  46. ///////////////////////////////////////////////////////////////////////////
  47.  
  48. class vdint3 {
  49. public:
  50.     typedef vdint3 self_type;
  51.     typedef int value_type;
  52.  
  53.     int&        operator[](int k)                    { return v[k]; }
  54.     const int&    operator[](int k) const                { return v[k]; }
  55.  
  56.     int            lensq() const                        { return x*x + y*y + z*z; }
  57.     int            len() const                            { return (int)sqrtf((float)(x*x + y*y + z*z)); }
  58.     self_type    normalized() const                    { return *this / len(); }
  59.  
  60.     vdint2    project() const                        { const int inv(int(1)/z); const vdint2 a = {x*inv, y*inv}; return a; }
  61.     vdint2    as2d() const                        { const vdint2 a = {x, y}; return a; }
  62.  
  63.     self_type    operator-() const                    { const self_type a = {-x, -y, -z}; return a; }
  64.  
  65.     self_type    operator+(const self_type& r) const    { const self_type a = {x+r.x, y+r.y, z+r.z}; return a; }
  66.     self_type    operator-(const self_type& r) const    { const self_type a = {x-r.x, y-r.y, z-r.z}; return a; }
  67.  
  68.     self_type&    operator+=(const self_type& r)        { x+=r.x; y+=r.y; z+=r.z; return *this; }
  69.     self_type&    operator-=(const self_type& r)        { x-=r.x; y-=r.y; z-=r.z; return *this; }
  70.  
  71.     self_type    operator*(const int s) const        { const self_type a = {x*s, y*s, z*s}; return a; }
  72.     self_type&    operator*=(const int s)                { x*=s; y*=s; z*=s; return *this; }
  73.  
  74.     self_type    operator/(const int s) const        { const self_type a = {x/s, y/s, z/s}; return a; }
  75.     self_type&    operator/=(const int s)                { x /= s; y /= s; z /= s; return *this; }
  76.  
  77.     self_type    operator*(const self_type& r) const        { self_type a = {x*r.x, y*r.y, z*r.z}; return a; }
  78.     self_type&    operator*=(const self_type& r)            { x*=r.x; y*=r.y; z*=r.z; return *this; }
  79.  
  80.     self_type    operator/(const self_type& r) const        { self_type a = {x/r.x, y/r.y, z/r.z}; return a; }
  81.     self_type&    operator/=(const self_type& r)            { x/=r.x; y/=r.y; z/=r.z; return *this; }
  82.  
  83.     union {
  84.         struct {
  85.             int x;
  86.             int y;
  87.             int z;
  88.         };
  89.         int v[3];
  90.     };
  91. };
  92.  
  93. VDFORCEINLINE vdint3 operator*(const int s, const vdint3& v) { return v*s; }
  94.  
  95. ///////////////////////////////////////////////////////////////////////////
  96.  
  97. class vdint4 {
  98. public:
  99.     typedef vdint4 self_type;
  100.     typedef int value_type;
  101.  
  102.     int&            operator[](int i) { return v[i]; }
  103.     const int&    operator[](int i) const { return v[i]; }
  104.  
  105.     int            lensq() const                        { return x*x + y*y + z*z + w*w; }
  106.     int            len() const                            { return (int)sqrtf((float)(x*x + y*y + z*z + w*w)); }
  107.     self_type    normalized() const                    { return *this / len(); }
  108.  
  109.     vdint3    project() const                        { const int inv(int(1)/w); const vdint3 a = {x*inv, y*inv, z*inv}; return a; }
  110.  
  111.     self_type    operator-() const                    { const self_type a = {-x, -y, -z, -w}; return a; }
  112.  
  113.     self_type    operator+(const self_type& r) const    { const self_type a = {x+r.x, y+r.y, z+r.z, w+r.w}; return a; }
  114.     self_type    operator-(const self_type& r) const    { const self_type a = {x-r.x, y-r.y, z-r.z, w-r.w}; return a; }
  115.  
  116.     self_type&    operator+=(const self_type& r)        { x+=r.x; y+=r.y; z+=r.z; w+=r.w; return *this; }
  117.     self_type&    operator-=(const self_type& r)        { x-=r.x; y-=r.y; z-=r.z; w-=r.w; return *this; }
  118.  
  119.     self_type    operator*(const int factor) const    { const self_type a = {x*factor, y*factor, z*factor, w*factor}; return a; }
  120.     self_type    operator/(const int factor) const    { const self_type a = {x/factor, y/factor, z/factor, w/factor}; return a; }
  121.  
  122.     self_type&    operator*=(const int factor)        { x *= factor; y *= factor; z *= factor; w *= factor; return *this; }
  123.     self_type&    operator/=(const int factor)        { x /= factor; y /= factor; z /= factor; w /= factor; return *this; }
  124.  
  125.     self_type    operator*(const self_type& r) const        { self_type a = {x*r.x, y*r.y, z*r.z, w*r.w}; return a; }
  126.     self_type&    operator*=(const self_type& r)            { x*=r.x; y*=r.y; z*=r.z; w*=r.w; return *this; }
  127.  
  128.     self_type    operator/(const self_type& r) const        { self_type a = {x/r.x, y/r.y, z/r.z, w*r.w}; return a; }
  129.     self_type&    operator/=(const self_type& r)            { x/=r.x; y/=r.y; z/=r.z; w/=r.w; return *this; }
  130.  
  131.     union {
  132.         struct {
  133.             int x;
  134.             int y;
  135.             int z;
  136.             int w;
  137.         };
  138.         int v[4];
  139.     };
  140. };
  141.  
  142. VDFORCEINLINE vdint4 operator*(const int s, const vdint4& v) { return v*s; }
  143.  
  144. ///////////////////////////////////////////////////////////////////////////
  145.  
  146. class vdint2c : vdint2 {
  147. public:
  148.     VDFORCEINLINE vdint2c(int x2, int y2) {x=x2; y=y2;}
  149.     VDFORCEINLINE vdint2c(const int src[2]) {x=src[0]; y=src[1];}
  150. };
  151.  
  152. class vdint3c : vdint3 {
  153. public:
  154.     VDFORCEINLINE vdint3c(int x2, int y2, int z2) { x=x2; y=y2; z=z2; }
  155.     VDFORCEINLINE vdint3c(const int src[3]) { x=src[0]; y=src[1]; z=src[2]; }
  156. };
  157.  
  158. class vdint4c : vdint4 {
  159. public:
  160.     VDFORCEINLINE vdint4c(int x2, int y2, int z2, int w2) { x=x2; y=y2; z=z2; w=w2; }
  161.     VDFORCEINLINE vdint4c(const int src[4]) { x=src[0]; y=src[1]; z=src[2]; w=src[3]; }
  162. };
  163.  
  164. ///////////////////////////////////////////////////////////////////////////
  165.  
  166. namespace nsVDMath {
  167.     VDFORCEINLINE int dot(const vdint2& a, const vdint2& b) {
  168.         return a.x*b.x + a.y*b.y;
  169.     }
  170.  
  171.     VDFORCEINLINE int dot(const vdint3& a, const vdint3& b) {
  172.         return a.x*b.x + a.y*b.y + a.z*b.z;
  173.     }
  174.  
  175.     VDFORCEINLINE int dot(const vdint4& a, const vdint4& b) {
  176.         return a.x*b.x + a.y*b.y + a.z*b.z + a.w*b.w;
  177.     }
  178.  
  179.     VDFORCEINLINE vdint3 cross(const vdint3& a, const vdint3& b) {
  180.         const vdint3 r = {a.y*b.z - a.z*b.y, a.z*b.x - a.x*b.z, a.x*b.y - a.y*b.x};
  181.         return r;
  182.     }
  183. };
  184.